/**
 * @overview 文件工具类
 */


import fs from 'fs'
import path from 'path'

/**
 * 删除文件或文件夹
 * @export
 * @param {string} filesPath 文件或目录的路径
 * @memberof FileUtil
 */
export function delFiles(filesPath) {
  if (fs.existsSync(filesPath)) {
    const status = fs.statSync(filesPath)
    if (status.isDirectory()) {
      // 目录递归删除，删除失败自动重试4次
      fs.rmdirSync(filesPath, { maxRetries: 4, recursive: true })
    } else {
      fs.unlinkSync(filesPath) // 删除文件
    }
  }
}

/**
 * 文件是否存在
 * @param {string} filePath 文件路径
 * @returns {boolean} 返回布尔值
 * @memberof FileUtil
 */
export function isHasFile(filePath) {
  if (!filePath) return false
  try {
    // @ts-ignore
    fs.accessSync(filePath, fs.F_OK)
  } catch (e) {
    return false
  }
  return true
}

/**
 * 获取目录的全部文件列表
 * @param {string} dirPath 目录路径
 * @param {boolean} [isHasDir=true] 是否包含目录
 * @param {string[]} [ignoreArr=['.svn']] 忽略文件名
 * @returns {array}  返回目录下全部的文件或子目录的列表
 * @memberof FileUtil
 */
export function getFileList(dirPath, isHasDir = true, ignoreArr = ['.svn']) {
  // 返回的文件列表
  let fileListArr = []
  const filesArr = fs.readdirSync(dirPath, {
    withFileTypes: true
  })
  //普通目录合成
  for (const dirent of filesArr) {
    const isDir = dirent.isDirectory()
    const fileName = dirent.name
    let filePath = path.join(dirPath, fileName)
    if (ignoreArr.indexOf(fileName) == -1) {
      if (isDir) {
        const dir = filePath + '/'
        !isHasDir && fileListArr.push(dir)
        const otherArr = getFileList(filePath, isHasDir, ignoreArr)
        fileListArr = fileListArr.concat(otherArr)
      } else {
        fileListArr.push(filePath)
      }
    }
  }
  return fileListArr
}
